home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / tool / artemis1 / src / test.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-10-11  |  4.9 KB  |  190 lines

  1. /*
  2.     test.c
  3.     
  4.     zoom の最適化のための実験
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <ryosuke.h>
  9.  
  10. typedef    int    deci;
  11. #define    Dshift    8
  12. #define    DUNIT    (1<<Dshift)
  13. #define    Dmask    (DUNIT-1)
  14. #define    ID(i)    ((i)<<Dshift)
  15. #define    DI(d)    ((d)>>Dshift)
  16.  
  17. void zoomcopy(int sx1, int sy1, int sx2, int sy2,
  18.               int dx1, int dy1, int dx2, int dy2, bool matte_sw)
  19. // matte_sw : 半透明指定を有効化するスイッチ(通常 ON, view時 OFF)
  20. {
  21.     printf("zoomcopy source:[%3d,%3d,%3d,%3d]\n",sx1,sy1,sx2,sy2);
  22.     printf("         dest  :[%3d,%3d,%3d,%3d]\n",dx1,dy1,dx2,dy2);
  23.     // 縮小処理
  24.     //   8ビット固定小数で計算
  25. #define    _swap(a,b)    { int t; t=(a); (a)=(b); (b)=t; }
  26.     if (sx2 < sx1)
  27.         _swap(sx1,sx2);
  28.     if (sy2 < sy1)
  29.         _swap(sy1,sy2);
  30.     if (dx2 < dx1)
  31.         _swap(dx1,dx2);
  32.     if (dy2 < dy1)
  33.         _swap(dy1,dy2);
  34.     int sxl,syl,dxl,dyl;
  35.     sxl = sx2-sx1+1;
  36.     syl = sy2-sy1+1;
  37.     dxl = dx2-dx1+1;
  38.     dyl = dy2-dy1+1;
  39.     int x,y;
  40.     if (1 /* mode == MODE32K */)
  41.     {
  42.         if (dxl <= sxl || dyl <= syl)     // 縮小処理
  43.         {
  44.             printf("縮小\n");
  45.             for (y=dy1; y<=dy2; y++)
  46.             {
  47.                 for (x=dx1; x<=dx2; x++)
  48.                 {
  49.                     // 現在の転送先領域(点)に対応する転送元領域を算出
  50.                     deci y1,y2,x1,x2;
  51.                     if (dxl<=1)
  52.                     {
  53.                         x1 = ID(sx1);
  54.                         x2 = ID(sx2)-1;
  55.                     }
  56.                     else
  57.                     {
  58.                         x1 = ID(sx1) + (sxl-1) * (ID(x-dx1  )) / (dxl-1);
  59.                         x2 = ID(sx1) + (sxl-1) * (ID(x-dx1+1)) / (dxl-1) - 1;
  60.                     }
  61.                     if (dyl<=1)
  62.                     {
  63.                         y1 = ID(sy1);
  64.                         y2 = ID(sy2)-1;
  65.                     }
  66.                     else
  67.                     {
  68.                         y1 = ID(sy1) + (syl-1) * (ID(y-dy1  )) / (dyl-1);
  69.                         y2 = ID(sy1) + (syl-1) * (ID(y-dy1+1)) / (dyl-1) - 1;
  70.                     }
  71.                     int iy,ix;
  72.                     // XY方向の平均色を算出
  73.                     deci mean[3];
  74.                     {
  75.                         int i;
  76.                         deci mean_sum[3],mean_pow[3];
  77.                         mean_sum[0] = mean_sum[1] = mean_sum[2] = 0; // 重平均wk
  78.                         mean_pow[0] = mean_pow[1] = mean_pow[2] = 0; // 重みの和
  79.                         for (iy=DI(y1); iy<=DI(y2); iy++)
  80.                         {
  81.                             // X 方向の平均色を算出
  82.                             deci xmean[3];
  83.                             {
  84.                                 int i;
  85.                                 deci xmean_sum[3], xmean_pow[3];
  86.                                 xmean_sum[0] = xmean_sum[1] = xmean_sum[2] = 0;    // 重平均wk
  87.                                 xmean_pow[0] = xmean_pow[1] = xmean_pow[2] = 0; // 重みの和
  88.                                 for (ix=DI(x1); ix<=DI(x2); ix++)
  89.                                 {
  90.                                     deci leftx,rightx;
  91.                                     leftx = (ix==DI(x1) ? x1 : ID(ix));
  92.                                     rightx = (ix==DI(x2) ? x2 : ID(ix+1));
  93.                                     int c,rgb[3];
  94.                                     c = 0;
  95.                                     printf("point(%d,%d)\n", ix,iy);
  96.                                     rgb[0]=(c>>5)&0x1f; rgb[1]=(c>>10)&0x1f; rgb[2]=c&0x1f;
  97.                                     int i;
  98.                                     for (i=0; i<3; i++)
  99.                                     {
  100.                                         xmean_sum[i] += rgb[i] * (rightx-leftx);
  101.                                         xmean_pow[i] += (rightx-leftx);
  102.                                     }
  103.                                 }
  104.                                 for (i=0; i<3; i++)
  105.                                 {
  106.                                     if (xmean_pow[i] == 0)
  107.                                         xmean[i] = 0;
  108.                                     else
  109.                                         xmean[i] = (xmean_sum[i]<<Dshift)/xmean_pow[i];
  110.                                 }
  111.                             }
  112.                             deci topy, bottomy;
  113.                             topy = (iy==DI(y1) ? y1 : ID(iy));
  114.                             bottomy = (iy==DI(y2) ? y2 : ID(iy+1));
  115.                             for (i=0; i<3; i++)
  116.                             {
  117.                                 mean_sum[i] += (xmean[i] * (bottomy-topy))>>Dshift;
  118.                                 mean_pow[i] += (bottomy-topy);
  119.                             }
  120.                         }
  121.                         for (i=0; i<3; i++)
  122.                         {
  123.                             if (mean_pow[i] == 0)
  124.                                 mean[i] = 0;
  125.                             else
  126.                                 mean[i] = ((mean_sum[i]<<Dshift) / mean_pow[i] + DUNIT/2) >> Dshift;
  127.                         }
  128.                     }
  129.                     printf("pset(%d,%d)\n",x,y);
  130.                 }
  131.             }
  132.         }
  133.         else     // 拡大処理
  134.         {
  135.             printf("拡大\n");
  136.             for (y=dy1; y<=dy2; y++)
  137.             {
  138.                 for (x=dx1; x<=dx2; x++)
  139.                 {
  140.                     deci sx,sy;
  141.                     if (dxl<=1)
  142.                         sx = ID(sx1);
  143.                     else
  144.                         sx = ID(sx1) + ((sxl-1) * (ID((x-dx1)))) / (dxl-1);
  145.                     if (dyl<=1)
  146.                         sy = ID(sy1);
  147.                     else
  148.                         sy = ID(sy1) + ((syl-1) * (ID((y-dy1)))) / (dyl-1);
  149.                     int r[2][2],g[2][2],b[2][2],i,j;
  150.                     for (i=0; i<2; i++)
  151.                     {
  152.                         for (j=0; j<2; j++)
  153.                         {
  154.                             int c;
  155.                             c = 0;
  156.                             printf("point(%d,%d)\n", DI(sx)+j,DI(sy)+i);
  157.                             r[j][i] = (c >>  5) & 0x1f;
  158.                             g[j][i] = (c >> 10) & 0x1f;
  159.                             b[j][i] =  c        & 0x1f;
  160.                         }
  161.                     }
  162.                     int t1,t2,r1,g1,b1;
  163.                         t1 = (r[0][0]*(DUNIT-(sx&Dmask)) + r[1][0]*(sx&Dmask)) >> Dshift;
  164.                         t2 = (r[0][1]*(DUNIT-(sx&Dmask)) + r[1][1]*(sx&Dmask)) >> Dshift;
  165.                     r1 = (t1*(DUNIT-(sy&Dmask)) + t2*(sy&Dmask)) >> Dshift;
  166.                         t1 = (g[0][0]*(DUNIT-(sx&Dmask)) + g[1][0]*(sx&Dmask)) >> Dshift;
  167.                         t2 = (g[0][1]*(DUNIT-(sx&Dmask)) + g[1][1]*(sx&Dmask)) >> Dshift;
  168.                     g1 = (t1*(DUNIT-(sy&Dmask)) + t2*(sy&Dmask)) >> Dshift;
  169.                         t1 = (b[0][0]*(DUNIT-(sx&Dmask)) + b[1][0]*(sx&Dmask)) >> Dshift;
  170.                         t2 = (b[0][1]*(DUNIT-(sx&Dmask)) + b[1][1]*(sx&Dmask)) >> Dshift;
  171.                     b1 = (t1*(DUNIT-(sy&Dmask)) + t2*(sy&Dmask)) >> Dshift;
  172.                     printf("pset(%d,%d)\n", x,y);
  173.                 }
  174.             }
  175.         }
  176.     }
  177. }
  178.  
  179.  
  180. main(int argc, char *argv[])
  181. {
  182.     if (argc < 9)
  183.     {
  184.         printf("usage : test sx1 sy1 sx2 sy2 dx1 dy1 dx2 dy2\n");
  185.         exit(0);
  186.     }
  187.     zoomcopy(atoi(argv[1]),atoi(argv[2]),atoi(argv[3]),atoi(argv[4]),
  188.              atoi(argv[5]),atoi(argv[6]),atoi(argv[7]),atoi(argv[8]),NO);
  189. }
  190.